<html>
  <head>
    <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MyBatis_2	基本的CRUD | 清汤牛肉锅</title>
<meta name="description" content="温故而知新
" />
<link rel="shortcut icon" href="https://ArtZoick.github.io//favicon.ico?v=1572228390311">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.10.0/katex.min.css">
<link rel="stylesheet" href="https://ArtZoick.github.io//styles/main.css">

<script src="https://cdn.bootcss.com/highlight.js/9.12.0/highlight.min.js"></script>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Droid+Serif:400,700">


<script async src="https://www.googletagmanager.com/gtag/js?id=UA-143265163-1"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-143265163-1');
</script>


  </head>
  <body>
    <div class="main">
      <div class="main-content">
        <div class="site-header">
  <a href="https://ArtZoick.github.io/">
  <img class="avatar" src="https://ArtZoick.github.io//images/avatar.png?v=1572228390311" alt="">
  </a>
  <h1 class="site-title">
    清汤牛肉锅
  </h1>
  <p class="site-description">
    温故而知新

  </p>
  <div class="menu-container">
    
      
        <a href="/" class="menu">
          首页
        </a>
      
    
      
        <a href="/archives" class="menu">
          归档
        </a>
      
    
      
        <a href="/tags" class="menu">
          标签
        </a>
      
    
      
        <a href="/post/about" class="menu">
          关于
        </a>
      
    
      
        <a href="/post/beef" class="menu">
          牛肉锅
        </a>
      
    
  </div>
  <div class="social-container">
    
      
    
      
    
      
    
      
    
      
    
  </div>
</div>

        <div class="post-detail">
          <article class="post">
            <h2 class="post-title">
              MyBatis_2	基本的CRUD
            </h2>
            <div class="post-info">
              <span>
                2019-07-03
              </span>
              <span>
                15 min read
              </span>
              
                <a href="https://ArtZoick.github.io//tag/framework" class="post-tag">
                  # 框架
                </a>
              
                <a href="https://ArtZoick.github.io//tag/MyBatis" class="post-tag">
                  # MyBatis
                </a>
              
            </div>
            
            <div class="post-content-wrapper">
              <div class="post-content">
                <p>1、回顾MyBatis的自定义再分析和环境搭建+完善基于注解的MyBatis<br>
2、MyBatis的CRUD（基于代理dao的方式）<br>
3、MyBatis中的参数深入及结果集的深入<br>
4、MyBatis中基于传统dao的方式（编写dao的实现类）---了解的内容<br>
5、MyBatis中的配置(主配置文件：SqlMapConfig.xml)<br>
　　　　　properties标签<br>
　　　　　typeAliases标签<br>
　　　　　mappers标签</p>
<p><strong>OGNL表达式:</strong><br>
Object Graphic Navigation Language<br>
对象 　　图　　　导航 　　　语言<br>
它是通过对象的取值方法来获取数据。·在写法上把get给省略了<br>
比如:我们获取用户的名称<br>
　　　　类中的写法:user.getUsername,<br>
　　　　OGNL表达式写法:user.username<br>
mybatis中为什么能直接写username,而不用user.呢:<br>
　　　　因为在parameterType中已经提供了属性所属的类, 所以此时不需要写对象名</p>
<h2 id="完整接口类代码">完整接口类代码</h2>
<pre><code class="language-java">package top.zoick.dao;

import top.zoick.domain.QueryVo;
import top.zoick.domain.User;

import java.util.List;

/**
 * @author zoick
 * @date 2019/7/4 17:34
 * 用户的持久层接口
 */
public interface IUserDao {

    /**
     * 查询所有操作
     * @return
     */
    List&lt;User&gt; findAll();

    /**
     * 保存用户
     * @param user
     */
    void saveUser(User user);

    /**
     * 更新用户
     * @param user
     */
    void updateUser(User user);

    /**
     * 根据删除用户
     * @param userId
     */
    void deleteUser(Integer userId);

    /**
     * 根据id查询用户信息
     * @param userId
     * @return
     */
    User findByID(Integer userId);

    /**
     * 根据名称模糊查询用户信息
     * @param username
     * @return
     */
    List&lt;User&gt; findByName(String username);


    /**
     * 查询总用户数
     * @return
     */
    Integer findTotal();

    /**
     * 根据QueryVo中的条件查询用户
     * @param vo
     * @return
     */
    List&lt;User&gt; findUserByVo(QueryVo vo);


}
</code></pre>
<h2 id="完整mapper代码">完整mapper代码</h2>
<pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE mapper
        PUBLIC &quot;-//mybatis.org//DTD Config 3.0//EN&quot;
        &quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&gt;

&lt;mapper namespace=&quot;top.zoick.dao.IUserDao&quot;&gt;

    &lt;!--配置查询结果的列名和实体类的属性名的对应关系--&gt;
    &lt;resultMap id=&quot;userMap&quot; type=&quot;top.zoick.domain.User&quot;&gt;
        &lt;!--主键字段的对应--&gt;
        &lt;id property=&quot;userId&quot; column=&quot;id&quot;&gt;&lt;/id&gt;
        &lt;!--非主键字段的对应--&gt;
        &lt;result property=&quot;userName&quot; column=&quot;username&quot;&gt;&lt;/result&gt;
        &lt;result property=&quot;userAddress&quot; column=&quot;address&quot;&gt;&lt;/result&gt;
        &lt;result property=&quot;userSex&quot; column=&quot;sex&quot;&gt;&lt;/result&gt;
        &lt;result property=&quot;userBirthday&quot; column=&quot;birthday&quot;&gt;&lt;/result&gt;
    &lt;/resultMap&gt;
    

    &lt;!--配置查询所有  其中id不能乱写必须是dao接口中的方法  resultType写的是实体类的全路径--&gt;
    &lt;select id=&quot;findAll&quot; resultMap=&quot;userMap&quot;&gt;
        &lt;!--实体类中的属性名和数据库表中元素名字匹配不上时，使用别名即可匹配。id为数据库中表的列名，userId为实体类中属性名--&gt;
        &lt;!--select id as userId,username as userName,address as userAddress ,sex as userSex, birthday as userBirthday from user--&gt;
        select * from user
&lt;/select&gt;

    &lt;!--保存用户--&gt;
    &lt;insert id=&quot;saveUser&quot; parameterType=&quot;top.zoick.domain.User&quot;&gt;
        &lt;!--配置插入操作后，获取插入数据的id--&gt;
            &lt;!--keyProperty对应实体类属性名:id，keyColumn对应于数据库:id resultType为数据类型，order为在这条insert sql语句执行前还是执行后做--&gt;
        &lt;selectKey keyProperty=&quot;userId&quot; keyColumn=&quot;id&quot; resultType=&quot;int&quot; order=&quot;AFTER&quot;&gt;
            select last_insert_id();
        &lt;/selectKey&gt;
        insert into user (username,address,sex,birthday) values (#{userName},#{userAddress},#{userSex},#{userBirthday})
    &lt;/insert&gt;

    &lt;!--更新用户--&gt;
    &lt;update id=&quot;updateUser&quot; parameterType=&quot;usER&quot;&gt;
        update user set username=#{userName},address=#{userAddress},sex=#{userSex},birthday=#{userBirthday} where id=#{userId}
    &lt;/update&gt;

    &lt;!--删除用户--&gt;
    &lt;!--当参数值为基本类型或者基本类型包装类时，SQL语句中的占位符可以随意写--&gt;
    &lt;delete id=&quot;deleteUser&quot; parameterType=&quot;Integer&quot;&gt;
        delete from user where id = #{anyzhanweifu}
    &lt;/delete&gt;

    &lt;!--根据id查询用户--&gt;
    &lt;select id=&quot;findByID&quot; parameterType=&quot;INT&quot; resultMap=&quot;userMap&quot;&gt;
        select * from user where id = #{uuuuuuid}
    &lt;/select&gt;

    &lt;!--根据名称模糊查询--&gt;
    &lt;select id=&quot;findByName&quot; parameterType=&quot;String&quot; resultMap=&quot;userMap&quot;&gt;
        select * from user where username like #{namenamenamename}
        &lt;!--select * from user where username like '%${value}%'--&gt;
    &lt;/select&gt;

    &lt;!--查询记录的总用户条数--&gt;
    &lt;select id=&quot;findTotal&quot; resultType=&quot;Integer&quot;&gt;
        select count(id) from user
    &lt;/select&gt;

    &lt;!--根据QueryVo的条件查询用户--&gt;
    &lt;select id=&quot;findUserByVo&quot; parameterType=&quot;top.zoick.domain.QueryVo&quot; resultMap=&quot;userMap&quot;&gt;
        select * from user where username like #{user.username}
    &lt;/select&gt;

&lt;/mapper&gt;
</code></pre>
<h2 id="完整测试类代码">完整测试类代码</h2>
<pre><code class="language-java">package top.zoick.test;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import top.zoick.dao.IUserDao;
import top.zoick.domain.QueryVo;
import top.zoick.domain.User;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * @author zoick
 * @date 2019/7/4 21:27
 * mybatis的入门案例
 */
public class MybatisTest {

    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;

    @Before//用于在测试方法执行之前执行
    public void init() throws Exception {
        //1.读取配置文件
        in = Resources.getResourceAsStream(&quot;SqlMapConfig.xml&quot;);
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂生产SqlSession对象
        sqlSession = factory.openSession();
        //4.使用SqlSession创建Dao接口的代理对象
        userDao = sqlSession.getMapper(IUserDao.class);
    }

    @After//用于在测试方法执行之后执行
    public void destory() throws IOException {

        //提交事务
        sqlSession.commit();

        //6.释放资源
        sqlSession.close();
        in.close();

    }

    /**
     * 测试查询所有
     *
     * @throws IOException
     */
    @Test
    public void testFindALl() throws Exception {
        init();
        //5.使用代理对象执行方法
        List&lt;User&gt; users = userDao.findAll();
        for (User user : users) {
            System.out.println(user);
        }
    }

    /**
     * 测试保存操作
     */
    @Test
    public void testSave() throws Exception {
        User user = new User();
        user.setUserName(&quot;modify user&quot;);
        user.setUserAddress(&quot;天津&quot;);
        user.setUserBirthday(new Date());
        user.setUserSex(&quot;男&quot;);

        System.out.println(&quot;保存操作之前：&quot; + user);
        init();
        //5.使用代理对象执行方法
        userDao.saveUser(user);

        System.out.println(&quot;保存操作之后：&quot; + user);
    }

    /**
     * 测试更新操作
     */
    @Test
    public void testUpdate() throws Exception {
        User user = new User();
        user.setUserId(51);
        user.setUserName(&quot;mybatis updateUser&quot;);
        user.setUserAddress(&quot;天津1&quot;);
        user.setUserBirthday(new Date());
        user.setUserSex(&quot;男&quot;);

        init();
        //5.使用代理对象执行方法
        userDao.updateUser(user);
    }

    /**
     * 测试删除
     */
    @Test
    public void testDelete() throws Exception {

        init();
        //5.执行删除方法
        userDao.deleteUser(51);
    }

    /**
     * 测试根据id查询用户
     */
    @Test
    public void testFindById() throws Exception {
        init();
        //5.执行查询一个
        User user = userDao.findByID(42);
        System.out.println(user);
    }

    /**
     * 测试名称模糊查询用户信息
     */
    @Test
    public void testFindByName() throws Exception {
        init();
        //5.执行模糊查询
        List&lt;User&gt; user = userDao.findByName(&quot;%彭%&quot;);
//        List&lt;User&gt; user = userDao.findByName(&quot;彭&quot;);
        System.out.println(user);
    }

    /**
     * 测试查询用户条数
     */
    @Test
    public void testFindTotal() throws Exception {
        init();
        //执行查询总记录条数
        Integer number = userDao.findTotal();
        System.out.println(&quot;总记录条数为：&quot; + number);
    }

    /**
     * 测试使用QueryVo作为查询条件
     */
    @Test
    public void testFindUserByVo() throws Exception {
        QueryVo vo = new QueryVo();
        User user = new User();
        user.setUserName(&quot;%彭%&quot;);
        vo.setUser(user);

        List&lt;User&gt; users = userDao.findUserByVo(vo);
        for (User u : users) {
            System.out.println(u);
        }
    }
}
</code></pre>
<h2 id="一些注意点">一些注意点：</h2>
<h3 id="1-数据库表的元素名与实体类的属性名不对应的解决">1、数据库表的元素名与实体类的属性名不对应的解决：</h3>
<p>1.起别名：</p>
<pre><code class="language-xml"> &lt;!--配置查询所有  其中id不能乱写必须是dao接口中的方法  resultType写的是实体类的全路径--&gt;
    &lt;select id=&quot;findAll&quot; resultType=&quot;top.zoick.domain.User&quot;&gt;
        &lt;!--实体类中的属性名和数据库表中元素名字匹配不上时，使用别名即可匹配。id为数据库中表的列名，userId为实体类中属性名--&gt;
        select id as userId,username as userName,address as userAddress ,sex as userSex, birthday as userBirthday from user
    &lt;/select&gt;
</code></pre>
<p>2.配置查询结果的列名和实体类的属性名的对应关系：</p>
<pre><code class="language-xml"> &lt;!--配置查询结果的列名和实体类的属性名的对应关系--&gt;
    &lt;resultMap id=&quot;userMap&quot; type=&quot;top.zoick.domain.User&quot;&gt;
        &lt;!--主键字段的对应--&gt;
        &lt;id property=&quot;userId&quot; column=&quot;id&quot;&gt;&lt;/id&gt;
        &lt;!--非主键字段的对应--&gt;
        &lt;result property=&quot;userName&quot; column=&quot;username&quot;&gt;&lt;/result&gt;
        &lt;result property=&quot;userAddress&quot; column=&quot;address&quot;&gt;&lt;/result&gt;
        &lt;result property=&quot;userSex&quot; column=&quot;sex&quot;&gt;&lt;/result&gt;
        &lt;result property=&quot;userBirthday&quot; column=&quot;bithday&quot;&gt;&lt;/result&gt;
    &lt;/resultMap&gt;

再在查询的sql语句的xml中加入配置
  &lt;select id=&quot;findAll&quot; resultMap=&quot;userMap&quot;&gt;
        select * from user
  &lt;/select&gt;
</code></pre>
<h3 id="2-配置xml中的属性标签">2、配置xml中的属性标签</h3>
<h3 id="1使用properties配置数据库连接欸信息">(1)使用properties配置数据库连接欸信息</h3>
<p>可以在标签内部配置数据库连接信息，也可以通过外部文件来配置数据库连接信息。</p>
<p><strong>第一种url属性(不常用)</strong></p>
<p>URL属性：<br>
　　URL:Uniform Resource Locator　统一资源定位符 可以唯一标志一个资源的位置<br>
　　写法必须是<br>
　　　　http://localhost:8080/mybatisserver/demo1Servlet<br>
　　　　协议　　主机　　端口　URI<br>
　　URI:Uniform Resource Identifier   统一资源标识符 是在应用中可以可以唯一标志一个资源的位置<br>
　　URL&gt;URI（精准性）</p>
<pre><code class="language-xml">&lt;properties url=&quot;file:///C:/Users/zoick/OneDrive/Tomorrow/%E6%A1%86%E6%9E%B6%E5%AD%A6%E4%B9%A0/MyBatis/day02/day02_eesy_02mybatisCRUD/src/main/resources/jdbcConfig.properties&quot;&gt;

&lt;/properties&gt;
</code></pre>
<p><strong>第二种resource属性（常用）</strong><br>
用于指定配置文件的位置，是按照类路径来写的，必须存在于类路径下</p>
<pre><code class="language-xml">&lt;properties resource=&quot;jdbcConfig.properties&quot;&gt;

&lt;/properties&gt;
</code></pre>
<h3 id="2使用typealiases配置别名">(2)使用typeAliases配置别名</h3>
<pre><code class="language-xml">&lt;!--使用typeAliases配置别名，他只能配置domain中类的别名--&gt;
    &lt;typeAliases&gt;
        &lt;!--typeAlias用于配置别名，type属性指定的是实体类中的全限定类名。alias属性指定别名，当指定了别名后不在区分大小写--&gt;
        &lt;typeAlias type=&quot;top.zoick.domain.User&quot; alias=&quot;user&quot;&gt;&lt;/typeAlias&gt;
    &lt;/typeAliases&gt;
</code></pre>
<h3 id="3使用package配置别名">(3)使用package配置别名</h3>
<pre><code class="language-xml"> &lt;typeAliases&gt;
        &lt;!--用于指定要配置别名的包，当指定后，该包下的实体类都会注册别名，并且类名就是别名，不再区分大小写--&gt;
        &lt;package name=&quot;top.zoick.domain&quot;/&gt;
    &lt;/typeAliases&gt;
</code></pre>
<p>其中，配置映射文件位置的<mappers>中也有package这个标签</p>
<pre><code class="language-xml">   &lt;mappers&gt;
&lt;!--        &lt;mapper resource=&quot;top/zoick/dao/IUserDao.xml&quot;/&gt;--&gt;
        &lt;!--package标签是用于指定dao接口所在的包，当指定了之后就不需要再写mapepr以及resource或者class了--&gt;
        &lt;package name=&quot;top.zoick.dao&quot;/&gt;
    &lt;/mappers&gt;

</code></pre>
<p>配置文件：</p>
<p><em>SqlMapConfig.xml</em></p>
<pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE configuration
        PUBLIC &quot;-//mybatis.org//DTD Config 3.0//EN&quot;
        &quot;http://mybatis.org/dtd/mybatis-3-config.dtd&quot;&gt;
&lt;!-- mybatis主配置文件--&gt;
&lt;configuration&gt;
    &lt;!--配置properties
        可以在标签内部配置数据库连接信息 也可以通过外部文件来配置数据库连接信息
        resource 属性：（常用）
                用于指定配置文件的位置，是按照类路径来写的，必须存在于类路径下
        URL属性：
            URL:Uniform Resource Locator    统一资源定位符 可以唯一标志一个资源的位置
            写法必须是
                http://localhost:8080/mybatisserver/demo1Servlet
                协议      主机    端口     URI
            URI:Uniform Resource Identifier 统一资源标识符 是在应用中可以可以唯一标志一个资源的位置
            URL&gt;URI（精准性）
    --&gt;
    &lt;properties url=&quot;file:///C:/Users/zoick/OneDrive/Tomorrow/%E6%A1%86%E6%9E%B6%E5%AD%A6%E4%B9%A0/MyBatis/day02/day02_eesy_02mybatisCRUD/src/main/resources/jdbcConfig.properties&quot;&gt;
&lt;!--        &lt;property name=&quot;driver&quot; value=&quot;com.mysql.cj.jdbc.Driver&quot;/&gt;--&gt;
&lt;!--        &lt;property name=&quot;url&quot; value=&quot;jdbc:mysql://localhost:3306/eesy_mybatis&quot;/&gt;--&gt;
&lt;!--        &lt;property name=&quot;username&quot; value=&quot;root&quot;/&gt;--&gt;
&lt;!--        &lt;property name=&quot;password&quot; value=&quot;root&quot;/&gt;--&gt;
    &lt;/properties&gt;
    
    &lt;!--使用typeAliases配置别名，他只能配置domain中类的别名--&gt;
    &lt;typeAliases&gt;
        &lt;!--typeAlias用于配置别名，type属性指定的是实体类中的全限定类名。alias属性指定别名，当指定了别名后不在区分大小写--&gt;
&lt;!--    &lt;typeAlias type=&quot;top.zoick.domain.User&quot; alias=&quot;user&quot;&gt;&lt;/typeAlias&gt;--&gt;

        &lt;!--用于指定要配置别名的包，当指定后，该包下的实体类都会注册别名，并且类名就是别名，不再区分大小写--&gt;
        &lt;package name=&quot;top.zoick.domain&quot;/&gt;
    &lt;/typeAliases&gt;
    
    

    &lt;!-- 配置环境--&gt;
    &lt;environments default=&quot;mysql&quot;&gt;
        &lt;!-- 配置mysql的环境--&gt;
        &lt;environment id=&quot;mysql&quot;&gt;
            &lt;!-- 配置事务的类型--&gt;
            &lt;transactionManager type=&quot;jdbc&quot;&gt;&lt;/transactionManager&gt;
            &lt;!-- 配置数据源（连接池）--&gt;
            &lt;dataSource type=&quot;POOLED&quot;&gt;
                &lt;!-- 配置链接数据库的四个基本信息--&gt;
                &lt;property name=&quot;driver&quot; value=&quot;${jdbc.driver}&quot;/&gt;
                &lt;property name=&quot;url&quot; value=&quot;${jdbc.url}&quot;/&gt;
                &lt;property name=&quot;username&quot; value=&quot;${jdbc.username}&quot;/&gt;
                &lt;property name=&quot;password&quot; value=&quot;${jdbc.password}&quot;/&gt;
            &lt;/dataSource&gt;
        &lt;/environment&gt;
    &lt;/environments&gt;

    &lt;!-- 指定映射配置文件的位置，映射配置文件指的是每个dao独立的配置文件--&gt;
    &lt;mappers&gt;
&lt;!--        &lt;mapper resource=&quot;top/zoick/dao/IUserDao.xml&quot;/&gt;--&gt;
        &lt;!--package标签是用于指定dao接口所在的包，当指定了之后就不需要再写mapepr以及resource或者class了--&gt;
        &lt;package name=&quot;top.zoick.dao&quot;/&gt;
    &lt;/mappers&gt;


&lt;/configuration&gt;
</code></pre>
<hr>
<h2 id="源码点这里">源码：<a href="https://github.com/ArtZoick/MyBatis">点🐔这里</a></h2>

              </div>
              <div class="toc-container">
                <ul class="markdownIt-TOC">
<li>
<ul>
<li><a href="#%E5%AE%8C%E6%95%B4%E6%8E%A5%E5%8F%A3%E7%B1%BB%E4%BB%A3%E7%A0%81">完整接口类代码</a></li>
<li><a href="#%E5%AE%8C%E6%95%B4mapper%E4%BB%A3%E7%A0%81">完整mapper代码</a></li>
<li><a href="#%E5%AE%8C%E6%95%B4%E6%B5%8B%E8%AF%95%E7%B1%BB%E4%BB%A3%E7%A0%81">完整测试类代码</a></li>
<li><a href="#%E4%B8%80%E4%BA%9B%E6%B3%A8%E6%84%8F%E7%82%B9">一些注意点：</a>
<ul>
<li><a href="#1-%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8%E7%9A%84%E5%85%83%E7%B4%A0%E5%90%8D%E4%B8%8E%E5%AE%9E%E4%BD%93%E7%B1%BB%E7%9A%84%E5%B1%9E%E6%80%A7%E5%90%8D%E4%B8%8D%E5%AF%B9%E5%BA%94%E7%9A%84%E8%A7%A3%E5%86%B3">1、数据库表的元素名与实体类的属性名不对应的解决：</a></li>
<li><a href="#2-%E9%85%8D%E7%BD%AExml%E4%B8%AD%E7%9A%84%E5%B1%9E%E6%80%A7%E6%A0%87%E7%AD%BE">2、配置xml中的属性标签</a></li>
<li><a href="#1%E4%BD%BF%E7%94%A8properties%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E6%AC%B8%E4%BF%A1%E6%81%AF">(1)使用properties配置数据库连接欸信息</a></li>
<li><a href="#2%E4%BD%BF%E7%94%A8typealiases%E9%85%8D%E7%BD%AE%E5%88%AB%E5%90%8D">(2)使用typeAliases配置别名</a></li>
<li><a href="#3%E4%BD%BF%E7%94%A8package%E9%85%8D%E7%BD%AE%E5%88%AB%E5%90%8D">(3)使用package配置别名</a></li>
</ul>
</li>
<li><a href="#%E6%BA%90%E7%A0%81%E7%82%B9%E8%BF%99%E9%87%8C">源码：点🐔这里</a></li>
</ul>
</li>
</ul>

              </div>
            </div>
          </article>
        </div>

        
          <div class="next-post">
            <div class="next">下一篇</div>
            <a href="https://ArtZoick.github.io//post/MyBatis_1">
              <h3 class="post-title">
                MyBatis_1	简介
              </h3>
            </a>
          </div>
        

        
          
            <link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css">
<script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script>

<div id="gitalk-container"></div>

<script>

  var gitalk = new Gitalk({
    clientID: 'a2471d09bddb5be481ee',
    clientSecret: '05d427fb27f873cfabace27b9f042f2c7f23000f',
    repo: 'ArtZoick.github.io',
    owner: 'ArtZoick',
    admin: ['ArtZoick'],
    id: (location.pathname).substring(0, 49),      // Ensure uniqueness and length less than 50
    distractionFreeMode: false  // Facebook-like distraction free mode
  })

  gitalk.render('gitalk-container')

</script>

          

          
        

        <div class="site-footer">
  <a href="https://zhidao.baidu.com/question/1867120235416383707.html" target="_blank" onclick="alert('盲生，你发现了华点！');">学习强国</a>

<!--Tido对话插件-->
<script src="//code.tidio.co/5fh6jaqvluqj8jjuf5zlqrf5tlzpktnx.js"></script>
<style>
.text-popup {
    animation: textPopup 1s;
    color: red;
    user-select: none;
    white-space: nowrap;
    position: absolute;
    z-index: 99;
}
@keyframes textPopup {
    0%, 100% {
        opacity: 0;
    }
    5% {
        opacity: 1;
    }
    100% {
        transform: translateY(-50px);    
    }
}
</style>
<script type="text/javascript" src="https://cdn.bootcss.com/canvas-nest.js/1.0.1/canvas-nest.min.js">
!function(){function n(n,e,t){return n.getAttribute(e)||t}function e(n){return document.getElementsByTagName(n)}
function t(){var t=e("script"),o=t.length,i=t[o-1];return{l:o,z:n(i,"zIndex",-1),o:n(i,"opacity",.5),c:n(i,"color","0,0,0")
,n:n(i,"count",99)}}function o(){a=m.width=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidt
h,c=m.height=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}function i(){r.clearRect
(0,0,a,c);var n,e,t,o,m,l;s.forEach(function(i,x){for(i.x+=i.xa,i.y+=i.ya,i.xa*=i.x>a||i.x<0?-1:1,i.ya*=i.y>c||i.y<0?-1:1,r.
fillRect(i.x-.5,i.y-.5,1,1),e=x+1;e<u.length;e++)n=u[e],null!==n.x&&null!==n.y&&(o=i.x-n.x,m=i.y-n.y,l=o*o+m*m,l<n.max&&(n===
y&&l>=n.max/2&&(i.x-=.03*o,i.y-=.03*m),t=(n.max-l)/n.max,r.beginPath(),r.lineWidth=t/2,r.strokeStyle="rgba("+d.c+","+(t+.2)+")
",r.moveTo(i.x,i.y),r.lineTo(n.x,n.y),r.stroke()))}),x(i)}var a,c,u,m=document.createElement("canvas"),d=t(),l="c_n"+d.l,r=m.
getContext("2d"),x=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.
oRequestAnimationFrame||window.msRequestAnimationFrame||function(n){window.setTimeout(n,1e3/45)},w=Math.random,y={x:null,y:nul
l,max:2e4};m.id=l,m.style.cssText="position:fixed;top:0;left:0;z-index:"+d.z+";opacity:"+d.o,e("body")[0].appendChild(m),o(),
window.οnresize=o,window.οnmοusemοve=function(n){n=n||window.event,y.x=n.clientX,y.y=n.clientY},window.οnmοuseοut=function(){y
.x=null,y.y=null};for(var s=[],f=0;d.n>f;f++){var h=w()*a,g=w()*c,v=2*w()-1,p=2*w()-1;s.push({x:h,y:g,xa:v,ya:p,max:6e3})}u=
s.concat([y]),setTimeout(function(){i()},100)}();
</script>

<!--鼠标点击-->
<!--富强-->
<script type="text/javascript"> 
/* 鼠标特效 */ 
var a_idx = 0; 
jQuery(document).ready(function($) { 
    $("body").click(function(e) { 
        var a = new Array("富强", "民主", "文明", "和谐", "自由", "平等", "公正" ,"法治", "爱国", "敬业", "诚信", "友善"); 
        var $i = $("<span/>").text(a[a_idx]); 
        a_idx = (a_idx + 1) % a.length; 
        var x = e.pageX, 
        y = e.pageY; 
        $i.css({ 
            "z-index": 999, 
            "top": y - 20, 
            "left": x, 
            "position": "absolute", 
            "font-weight": "bold", 
            "color": "#ff6651" 
        }); 
        $("body").append($i); 
        $i.animate({ 
            "top": y - 180, 
            "opacity": 0 
        }, 
        1500, 
        function() { 
            $i.remove(); 
        }); 
    }); 
}); 
</script>
<!--edn--富强--> | 
  <a class="rss" href="https://ArtZoick.github.io//atom.xml" target="_blank">RSS</a>
</div>

<script>
  hljs.initHighlightingOnLoad()

  let mainNavLinks = document.querySelectorAll(".markdownIt-TOC a");

  // This should probably be throttled.
  // Especially because it triggers during smooth scrolling.
  // https://lodash.com/docs/4.17.10#throttle
  // You could do like...
  // window.addEventListener("scroll", () => {
  //    _.throttle(doThatStuff, 100);
  // });
  // Only not doing it here to keep this Pen dependency-free.

  window.addEventListener("scroll", event => {
    let fromTop = window.scrollY;

    mainNavLinks.forEach((link, index) => {
      let section = document.getElementById(decodeURI(link.hash).substring(1));
      let nextSection = null
      if (mainNavLinks[index + 1]) {
        nextSection = document.getElementById(decodeURI(mainNavLinks[index + 1].hash).substring(1));
      }
      console.log('section.offsetHeight', section.offsetHeight);
      if (section.offsetTop <= fromTop) {
        if (nextSection) {
          if (nextSection.offsetTop > fromTop) {
            link.classList.add("current");
          } else {
            link.classList.remove("current");    
          }
        } else {
          link.classList.add("current");
        }
      } else {
        link.classList.remove("current");
      }
    });
  });

</script>

      </div>
    </div>
  </body>
</html>
